-- 
-- Nuevas funciones de stock para combos
--

-- FUNCTION: stock.tg_artm_upd_stk()

-- DROP FUNCTION stock.tg_artm_upd_stk();

CREATE OR REPLACE FUNCTION stock.tg_artm_upd_stk()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$
-- Trigger de after update sobre artm. Según si el artículo viejo registra stock y el arco mueve stock,
-- elimina los artmf (los cuales actualizan stk) para artículos compuestos, o actualiza stk para el
-- artículo viejo y decrementa la cantidad en la cantidad vieja.
DECLARE
  vRegistraStock Art.RegistraStock%TYPE;
  vStkComp Art.StkComp%TYPE;
  vSigno StkGra.Signo%TYPE;
  vModificaStock StkGra.ModificaStock%TYPE;
  vTipoCom ComM.TipoCom%TYPE;
BEGIN
  -- Si cambia la cantidad, el arco de stock, el depósito o el artículo
  IF ((OLD.IdArt != NEW.IdArt) OR (OLD.Cant != NEW.Cant) OR (OLD.CodStkDep != NEW.CodStkDep) OR
      (OLD.OrigenCodStkEst != NEW.OrigenCodStkEst) OR (OLD.CodStkEst != NEW.CodStkEst)) THEN
    -- Busca el comprobante padre del artm considerado (comm asociado)
    SELECT TipoCom INTO vTipoCom FROM public.ComM WHERE (Id = OLD.IdComM);
    -- Busca los valores de registra stock y si el artículo es compuesto, para el artículo viejo
    SELECT RegistraStock, StkComp INTO vRegistraStock, vStkComp FROM public.Art WHERE Id = OLD.IdArt;
    -- Busca el arco de stock viejo y se queda con el signo y si modifica stock o no.
    SELECT Signo, ModificaStock INTO vSigno, vModificaStock
         FROM public.StkGra
         WHERE (OrigenCodStkEst = OLD.OrigenCodStkEst) AND (DestinoCodStkEst = OLD.CodStkEst) AND
                   (TipoCom = vTipoCom) AND (Signo = OLD.Signo);
    IF ((vRegistraStock = 'S') AND (vModificaStock = 'S')) THEN
      IF (vStkComp = 'C') THEN
        -- Si es artículo compuesto elimino los artmf para luego volverlos a crear, en lugar de hacer updates
        DELETE FROM public.artmf WHERE (IdArtM = OLD.Id);
      ELSE
        -- Si el artículo registra stock, el arco modifica stock y el artículo no es compuesto, actualizo stk
        PERFORM stock.actualizar_stk(OLD.IdArt, OLD.CodStkDep, (-1) * OLD.Cant * vSigno, 1.00);
      END IF;
    END IF;

    -- Busca los valores de registra stock y si el artículo es compuesto, para el artículo nuevo
    SELECT RegistraStock, StkComp INTO vRegistraStock, vStkComp FROM public.Art WHERE Id = NEW.IdArt;
    -- Busca el arco de stock nuevo y se queda con el signo y si modifica stock o no.
    SELECT Signo, ModificaStock INTO vSigno, vModificaStock
         FROM public.StkGra
         WHERE (OrigenCodStkEst = NEW.OrigenCodStkEst) AND (DestinoCodStkEst = NEW.CodStkEst) AND
                   (TipoCom = vTipoCom) AND (Signo = NEW.Signo);
    IF ((vRegistraStock = 'S') AND (vModificaStock = 'S')) THEN
      IF (vStkComp = 'C') THEN
        -- Si el artículo registra stock, el arco modifica stock, pero el artículo es compuesto llamo
        -- un procedimiento para esa actualización de stock de artículos compuestos.
        PERFORM stock.agregar_art_compuestos(NEW.IdArt, NEW.Cant * vSigno, NEW.Id, NEW.CodStkDep);
      ELSE
        -- Si el artículo registra stock, el arco modifica stock y el artículo no es compuesto, actualizo stk
        PERFORM stock.actualizar_stk(NEW.IdArt, NEW.CodStkDep, NEW.Cant * vSigno, NEW.CantSec * vSigno);
      END IF;
    END IF;
  END IF;
  RETURN NEW;
END;
$BODY$;

ALTER FUNCTION stock.tg_artm_upd_stk()
    OWNER TO abacouser;

COMMENT ON FUNCTION stock.tg_artm_upd_stk()
    IS 'Cuerpo del trigger de artm que actualiza el stock físico de los artículos al modificar un movimiento de artículo.';


-- DROP FUNCTION stock.tg_artmf_del_stk();

CREATE OR REPLACE FUNCTION stock.tg_artmf_del_stk()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$
--  Trigger after delete sobre artmf.
BEGIN
  PERFORM stock.actualizar_stk(OLD.IdArt, OLD.CodStkDep, (-1) * OLD.Cant, 1.00);
  RETURN NEW;
END;
$BODY$;

ALTER FUNCTION stock.tg_artmf_del_stk()
    OWNER TO abacouser;

COMMENT ON FUNCTION stock.tg_artmf_del_stk()
    IS 'Cuerpo del trigger de artmf que actualiza el stock físico de los artículos que componen un artículo al eliminar un movimiento de artículo compuesto.';

CREATE OR REPLACE FUNCTION stock.tg_artmf_ins_stk()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$
--  Trigger after insert sobre artmf.
BEGIN
  PERFORM stock.actualizar_stk(NEW.IdArt, NEW.CodStkDep, NEW.Cant, 1.00);
  RETURN NEW;
END;
$BODY$;

ALTER FUNCTION stock.tg_artmf_ins_stk()
    OWNER TO abacouser;

COMMENT ON FUNCTION stock.tg_artmf_ins_stk()
    IS 'Cuerpo del trigger de artmf que actualiza el stock físico de los artículos que componen un artículo al hacer un movimiento de artículo compuesto.';


---
SELECT aaVersion('519.06','519.05');
--	
	
	


